<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
    
        function foo() {
            console.log('这是 foo函数体');
        }
         foo();

        //  1.简单赋值
        // 将函数 赋值给变量
        var func = foo;
        // 使用 赋值后的变量调用函数
        func();

        // 2. 赋值拓展
        function fn1() {
            console.log('这是 fn1 函数体');
        }
        // var arr = [{name: '王宝'}, 123, '字符串'];
        var arr = [fn1, foo];
        // var n = arr[0]; // 2.1先取出 数组中的函数
        // n(); // 2.2 调用数组中取出来的函数

        arr[0]();
        arr[1]();


        // 3. 将函数 当做参数传递， 实现回调函数 

        function fn2(fun) {
            // 判断参数是否 是函数
            if(typeof fun == 'function') {
                fun(); // 如果是函数就执行函数
            } else {
                console.log('error:这不是一个函数');
            }
        }

        // fn2(123);

        var fn3 = function () {
            console.log('这是 要执行的 回调函数 f3');
        }
        fn2(fn3)


        // 3.1 函数直接当做参数传递， fn2函数中的 fun 形参 直接引用 实参函数
        // 相当于 将 匿名函数的 地址 直接传递给了 fn2函数的 形参 fun， fun就可以执行这个匿名函数
        fn2(function() {
            console.log('这是需要执行的回调函数');
        })
        
    
    </script>
</body>
</html>